/*
leetcode 1089.复写零
给你一个长度固定的整数数组 arr ，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。

注意：请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。

示例 1：

输入：arr = [1,0,2,3,0,4,5,0]
输出：[1,0,0,2,3,0,0,4]
解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]
示例 2：

输入：arr = [1,2,3]
输出：[1,2,3]
解释：调用函数后，输入的数组将被修改为：[1,2,3]
 */
public class Solution {
    /*
        双指针算法
        1、先找到最后一个“复写”的数
        （注意要处理边界情况）
        2、从后往前实现复写操作
     */
    public void duplicateZeros(int[] arr) {
        int len=arr.length,cur=0,dest=-1;
        //1、先找到最后一个“复写”的数
        for(;cur<len;cur++){
            if(arr[cur]==0){
                dest+=2;
            }else{
                dest++;
            }
            if(dest==len-1)break;
            //处理如果cur最后指向的是0的情况
            if(dest>len-1){
                arr[len-1]=0;
                cur--;
                dest=len-2;
                break;
            }
        }
        if(dest==cur)return;
        //反向完成复写操作
        while(cur>=0){
            if(arr[cur]!=0){
                arr[dest--]=arr[cur--];
            }else{
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }
    }
}

